package belleza.relativa

import belleza.relativa.security.User

class Persona implements Serializable{

    static constraints = {
        nombre(blank: false, maxSize: 100)
        apellido(blank: false, maxSize: 100)
        usuario(nullable: false)
        email(blank: false, email: true)
        sexo(inList: ["M", "F"], nullable: false, blank: false);
        sexoBuscado(inList: ["M", "F"], nullable: false, blank: false);
        biografia(blank: true, maxSize: 255)
        fechaNacimiento(validator: {return (it < new Date())})
        pais(inList: ["Argentina", "Brasil", "Chile", "Bolivia", "Uruguay"], blank: false)
        cantVotos(min: 0)
        fotoPrincipal(nullable: true)
    }

    def static hasOne = [usuario: User]

    def static hasMany = [conversaciones: Conversacion, fotos: Foto,
            solicitudesRealizadas: Solicitud, solicitudesRecibidas: Solicitud]
    static mappedBy = [solicitudesRealizadas: 'solicitante', solicitudesRecibidas: 'solicitado']

    String nombre
    String apellido
    String email
    String pais
    Date fechaNacimiento
    String sexo
    String sexoBuscado
    String biografia
    Foto fotoPrincipal
    //Para calcular la reputacion
    int cantVotos
    int puntaje

    def getUserName() {
        return this.getUsuario()?.getUsername()
    }

    def getFullName() {
        return this.nombre + " " + this.apellido
    }

    def getFotosNoPrincipal() {
        Foto.findAllByPropietarioAndPrincipal(this, false)
    }

    def puntuar(def puntaje) {
        int cantidadVotos = this.getCantVotos()
        int puntajeFinal = this.getPuntaje()
        if (cantidadVotos) {
            cantidadVotos += 1
            puntajeFinal += puntaje
        } else {
            cantidadVotos = 1;
            puntajeFinal = Integer.parseInt(puntaje)
        }
        this.setCantVotos(cantidadVotos)
        this.setPuntaje(puntajeFinal)
        this.save(flush: true)
    }

    def getReputacion() {
        if (this.cantVotos != 0)
            return this.puntaje / this.cantVotos
        else
            return 0
    }
}
